package cn.jishiyu11.xeqb.utils

import android.content.Context
import android.os.Environment
import android.os.StatFs
import android.widget.Toast

import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException

/**
 * 判断ＳＤ卡是否挂载
 * 获取ＳＤ卡的根目录
 * 获取ＳＤ卡总容量
 * 获取ＳＤ卡剩余容量
 * 向ＳＤ卡９大共有目录保存数据
 * 向ＳＤ卡私有File目录写入数据
 * 向ＳＤ卡私有Cache目录写入数据
 * 从ＳＤ卡中读取数据
 * vvguoliang
 */
object SDCardUtils {

    /**
     * 判断ＳＤ卡是否挂载
     */
    val isSDCardMounted: Boolean
        get() = Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED

    /**
     * 返回ＳＤ卡根目录
     *
     * @return
     */
    val sdCardRootDir: String
        get() = Environment.getExternalStorageDirectory().path

    /**
     * 获取ＳＤ卡总容量
     */
    //StatFs Statistic File System  簇
    //返回ＭＢ
    val sdCardTotalSize: Long
        get() {
            if (isSDCardMounted) {
                val sf = StatFs(sdCardRootDir)
                val blockSize = sf.blockSize
                val blockCount = sf.blockCount

                return (blockSize * blockCount / 1024 / 1024).toLong()
            }
            return 0
        }

    /**
     * 获取ＳＤ卡可用容量
     *
     * @return
     */
    val sdCardAvailableSize: Long
        get() {
            if (isSDCardMounted) {
                val sf = StatFs(sdCardRootDir)
                val availableBlockCount = sf.availableBlocks
                val blockSize = sf.blockSize

                return (availableBlockCount * blockSize / 1024 / 1024).toLong()
            }
            return 0
        }

    /**
     * 进行文件夹删除
     */
    private val filename = arrayOf("sxs", "cache")

    /**
     * 向ＳＤ卡９大共有目录保存数据
     *
     * @param data     需要保存的数据
     * @param type     　区分９大共有目录的type
     * @param fileName 另存为的文件名称
     * @return
     */
    fun saveFileToPublicDirectory(data: ByteArray,
                                  type: String, fileName: String): Boolean {
        if (isSDCardMounted) {
            var bos: BufferedOutputStream? = null
            val fileDir = Environment.getExternalStoragePublicDirectory(type)
            val file = File(fileDir, fileName)
            if (!file.exists()) {
                try {
                    file.createNewFile()
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
            try {
                bos = BufferedOutputStream(FileOutputStream(file))
                bos.write(data)
                bos.flush()
                return true
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                if (bos != null) {
                    try {
                        bos.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }

                }
            }
        }
        return false
    }

    /**
     * 向ＳＤ卡私有File目录写入数据
     *
     * @param context  　上下文，用来找到storage/sdcard0/Android/data/packageName/files
     * @param data     需要保存的数据
     * @param type     　文件加类型
     * @param fileName 　另存为的文件名名称
     * @return
     */
    fun saveFileToExternalFileDir(context: Context, data: ByteArray,
                                  type: String, fileName: String): Boolean {
        if (isSDCardMounted) {
            var bos: BufferedOutputStream? = null
            val fileDir = context.getExternalFilesDir(null)
            val file = File(fileDir, fileName)
            if (!file.exists()) {
                try {
                    file.createNewFile()
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
            try {
                bos = BufferedOutputStream(FileOutputStream(file))
                bos.write(data)
                bos.flush()
                return true
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                if (bos != null) {
                    try {
                        bos.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }

                }
            }
        }
        return false
    }

    /**
     * 向ＳＤ卡私有Cache目录写入数据
     *
     * @param context  　上下文，用来找到storage/sdcard0/Android/data/packageName/cache
     * @param data     需要保存的数据
     * @param fileName 　另存为的文件名名称
     * @return
     */
    fun saveFileToExternalCacheDir(context: Context, data: ByteArray,
                                   fileName: String): Boolean {
        if (isSDCardMounted) {
            var bos: BufferedOutputStream? = null
            val fileDir = context.externalCacheDir
            val file = File(fileDir, fileName)
            if (!file.exists()) {
                try {
                    file.createNewFile()
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
            try {
                bos = BufferedOutputStream(FileOutputStream(file))
                bos.write(data)
                bos.flush()
                return true
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                if (bos != null) {
                    try {
                        bos.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }

                }
            }
        }
        return false
    }

    /**
     * 从ＳＤ卡中读取数据
     *
     * @param fileAbsolutePath 　　读取文件的绝对路径
     * @return
     */
    fun loadDataFromSDCard(fileAbsolutePath: String): ByteArray? {
        if (isSDCardMounted) {
            var bis: BufferedInputStream? = null
            val baos = ByteArrayOutputStream()

            try {
                bis = BufferedInputStream(
                        FileInputStream(fileAbsolutePath))
                val buffer = ByteArray(1024 * 8)
                var len: Int
                while (bis.read(buffer) != -1) {
                    len = bis.read(buffer)
                    baos.write(buffer, 0, len)
                    baos.flush()
                }
                return baos.toByteArray()
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                try {
                    if (bis != null) {
                        bis.close()
                    }
                    baos.close()
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
        }
        return null
    }

    fun getSDCardCacheDir(context: Context): String {
        return context.externalCacheDir!!.path
    }

    fun setSDdelete(context: Context) {
        if (isSDCardMounted) {//存在执行
            deleteAllFiles(context, sdCardRootDir, filename)
        }
    }

    /**
     * 判断文件夹是否存在，进行删除操作
     *
     * @param filePath
     * @param fileName
     */
    private fun deleteAllFiles(context: Context, filePath: String, fileName: Array<String>) {
        val f = File(filePath)
        if (f.exists()) {
            for (aFileName in fileName) {
                val file = File(filePath + "/" + aFileName)
                clear(file)
            }
        } else {
            //            ToatUtils.showShort1(context, "文件不存在");
            Toast.makeText(context, "文件不存在", Toast.LENGTH_SHORT)
        }
    }

    /**
     * 若将整个sxs文件夹删除，则只需调用这个方法
     */
    private fun clear(file: File) {
        if (file.exists()) { //指定文件是否存在
            if (file.isFile) { //该路径名表示的文件是否是一个标准文件
                file.delete() //删除该文件
            } else if (file.isDirectory) { //该路径名表示的文件是否是一个目录（文件夹）
                val files = file.listFiles() //列出当前文件夹下的所有文件
                for (f in files) {
                    clear(f) //递归删除
                    //Log.d("fileName", f.getName()); //打印文件名
                }
            }
            file.delete() //删除文件夹（song,art,lyric）
        }
    }

}

